package com.situation.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectResult;

import java.io.*;

/**
 * @author TaoMinghui
 * @create 2021-10-23 14:55
 */
public class OSSUtil {
    private static final String endpoint;
    private static final String accessKeyId;
    private static final String accessKeySecret;
    private static final String BUCKETNAME;  // 仓库名称

    static {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。
        // 以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
        endpoint = "oss-cn-hongkong.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。
        // 强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        accessKeyId = "LTAI5t5vKcpnACh2KCUhYpYf";
        accessKeySecret = "zcS4Wwzq8kyWBhrcahMPivrZq43dq2";
        BUCKETNAME = "eda02";
    }

    public static OSS getOssClient() throws FileNotFoundException {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        if (ossClient.doesBucketExist(BUCKETNAME)) {
            System.out.println("bucket 存在");
        } else {
            // 通过api接口创建bucket仓库
            System.out.println("bucket不存在，创建新的bucket：" + BUCKETNAME);
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(null);
            createBucketRequest.setBucketName(BUCKETNAME);
            createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
            ossClient.createBucket(createBucketRequest);
            ossClient.shutdown();
        }
        return ossClient;
    }

    public static PutObjectResult putObjectToOSS(OSS ossClient, String fileNametemp) throws FileNotFoundException {
        // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        String fileName = fileNametemp.substring(fileNametemp.lastIndexOf("/") + 1);
        InputStream inputStream = new FileInputStream(fileNametemp);
        // 依次填写Bucket名称（例如examplebucket）和Object完整路径（例如exampledir/exampleobject.txt）。Object完整路径中不能包含Bucket名称。
        String OSSDirFile = "photo/" + fileName;
        PutObjectResult putObjectResult = ossClient.putObject("eda02", OSSDirFile, inputStream);
        // 关闭OSSClient。
        ossClient.shutdown();
        return putObjectResult;
    }

    public static void down(String objectFileName, String downDirFile) throws IOException {
// 创建OSSClient实例。
        OSS ossClient =OSSUtil.getOssClient();

// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(BUCKETNAME, objectFileName);

        InputStream in = ossObject.getObjectContent();
        FileOutputStream foutt = new FileOutputStream(downDirFile);

        byte[] b = new byte[1024];
        int i = in.read(b);
        while (i != -1) {
            foutt.write(b, 0, i);
            i = in.read(b);

        }
        // 数据读取完成后，获取的流必须关闭，否则会造成连接泄漏，导致请求无连接可用，程序无法正常工作。
        foutt.close();
        in.close();

        // 关闭OSSClient。
        ossClient.shutdown();
    }
}
